package com.huosu.utils;

import com.huosu.vo.Net;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

/**
 * @program: miner-shield
 * @description:
 * @author: changlin
 * @create: 2019-07-29 15:18
 **/
@Slf4j
public class IPv4Util {

//    static String ExternalIpUrl = "http://myexternalip.com/raw";

    /**
     * 根据掩码位计算掩码   24--> 255.255.255.0
     */
    public static String getNetMask(int masks) {
        int mask = -1 << (32 - masks);
        int partsNum = 4;
        int bitsOfPart = 8;
        int maskParts[] = new int[partsNum];
        int selector = 0x000000ff;
        for (int i = 0; i < maskParts.length; i++) {
            int pos = maskParts.length - 1 - i;
            maskParts[pos] = (mask >> (i * bitsOfPart)) & selector;
        }
        String result = "";
        result = result + maskParts[0];
        for (int i = 1; i < maskParts.length; i++) {
            result = result + "." + maskParts[i];
        }
        return result;
    }

    /**
     * 转换为验码位数 255.255.255.0  --> 24
     */
    public static int getNetMask(String netMarks) {
        StringBuffer sbf;
        String str;
        int inetmask = 0, count = 0;
        String[] ipList = netMarks.split("\\.");
        for (int n = 0; n < ipList.length; n++) {
            sbf = toBin(Integer.parseInt(ipList[n]));
            str = sbf.reverse().toString();
            count = 0;
            for (int i = 0; i < str.length(); i++) {
                i = str.indexOf('1', i);
                if (i == -1) {
                    break;
                }
                count++;
            }
            inetmask += count;
        }
        return inetmask;
    }

//    /**
//     * temp1根据temp2取反
//     */
//    private static String Negation(String ip, String netmask) {
//        String[] temp1 = ip.trim().split("\\.");
//        String[] temp2 = netmask.trim().split("\\.");
//        int[] rets = new int[4];
//        for (int i = 0; i < 4; i++) {
//            rets[i] = Integer.parseInt(temp1[i]) & Integer.parseInt(temp2[i]);
//        }
//        return rets[0] + "." + rets[1] + "." + rets[2] + "." + rets[3];
//    }
//
//    /**
//     * temp1根据temp2取或
//     */
//    private static String TaskOR(String ip, String netmask) {
//        String[] temp1 = ip.trim().split("\\.");
//        String[] temp2 = netmask.trim().split("\\.");
//        int[] rets = new int[4];
//        for (int i = 0; i < 4; i++) {
//            rets[i] = 255 - (Integer.parseInt(temp1[i]) ^ Integer.parseInt(temp2[i]));
//        }
//        return rets[0] + "." + rets[1] + "." + rets[2] + "." + (rets[3] - 1);
//    }
//
//    /**
//     * temp1根据temp2取 &
//     */
//    private static String TaskAND(String ip, String netmask) {
//        String[] temp1 = ip.trim().split("\\.");
//        String[] temp2 = netmask.trim().split("\\.");
//        int[] rets = new int[4];
//        for (int i = 0; i < 4; i++) {
//            rets[i] = Integer.parseInt(temp1[i]) & Integer.parseInt(temp2[i]);
//        }
//        return rets[0] + "." + rets[1] + "." + rets[2] + "." + rets[3];
//    }

//    /**
//     * 计算子网大小
//     */
//    public static int getPoolMax(int netMask) {
//        if (netMask <= 0 || netMask >= 32) {
//            return 0;
//        }
//        int bits = 32 - netMask;
//        return (int) Math.pow(2, bits) - 2;
//    }

    private static StringBuffer toBin(int x) {
        StringBuffer result = new StringBuffer();
        result.append(x % 2);
        x /= 2;
        while (x > 0) {
            result.append(x % 2);
            x /= 2;
        }
        return result;
    }

//    public static Net getNet(String ip, String subnetMask) {
//        Net nets = new Net();
//        nets.setIp(ip);
//        nets.setNetMask(subnetMask);
//
//        //1 获取 验码位数
//        int n_subnetMask = getNetMask(subnetMask);
//        nets.setNetMaskN(n_subnetMask);
//
//        String[] start = Negation(ip, subnetMask).split("\\.");
//        nets.setStartIp(start[0] + "." + start[1] + "." + start[2] + "." + (Integer.valueOf(start[3]) + 1));
//        nets.setEndIp(TaskOR(Negation(ip, subnetMask), subnetMask));
//
//        String network = TaskAND(ip, subnetMask);
//        nets.setNetwork(network);
//
//        String broadcast = getBroadcast(ip, subnetMask);
//        //
//        nets.setBroadcast(broadcast);
//        return nets;
//    }

//    private static String getBroadcast(String ip, String netmask) {
//
//        String[] temp1 = ip.trim().split("\\.");
//        String[] temp2 = netmask.trim().split("\\.");
//        int selector = 0x000000ff;
//        int[] rets = new int[4];
//        for (int i = 0; i < 4; i++) {
//            int t = ~Integer.parseInt(temp2[i]);
//            int t1 = t & selector;
//            rets[i] = Integer.parseInt(temp1[i]) | t1;
//        }
//        return rets[0] + "." + rets[1] + "." + rets[2] + "." + rets[3];
//    }

//    private static String getBroadcast(String network, int n_subnetMask) {
//
//        int net = 32 - n_subnetMask;
//        String netCount = StringUtils.leftPad(StringUtils.leftPad("", 11, "1"), 32, "0");
//
//        String[] str_maskParts = str_split(netCount, 8);
//
//        int[] n_maskParts = new int[str_maskParts.length];
//
//        for (int i = 0; i < str_maskParts.length; i++) {
//            n_maskParts[i] = Integer.valueOf(str_maskParts[i], 2);
//        }
//        String[] temp1 = network.trim().split("\\.");
//        int[] rets = new int[4];
//        for (int i = 0; i < 4; i++) {
//            rets[i] = Integer.parseInt(temp1[i]) | n_maskParts[i];
//        }
//
//        return rets[0] + "." + rets[1] + "." + rets[2] + "." + rets[3];
//    }

//    public static String[] str_split(String str, int length) {
//        int len = str.length();
//        String[] arr = new String[(len + length - 1) / length];
//        for (int i = 0; i < len; i += length) {
//            int n = len - i;
//            if (n > length) n = length;
//            arr[i / length] = str.substring(i, i + n);
//        }
//        return arr;
//    }
//
//    /**
//     * @return
//     */
//    public static String GetExternalIp() {
//        String ip = httpGet(ExternalIpUrl);
//        return ip;
//    }

//    public static String httpGet(String url) {
//        String returnStr = "";
//        try {
//            //复杂构造函数的使用
//            SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
//            // 设置超时
//            requestFactory.setConnectTimeout(10000);
//            requestFactory.setReadTimeout(10000);
//            //利用复杂构造器可以实现超时设置，内部实际实现为 HttpClient
//            RestTemplate restTemplate = new RestTemplate(requestFactory);
//            returnStr = restTemplate.getForObject(url, String.class);
//            // 转码原因：RestTemplate默认是使用org.springframework.http.converter.StringHttpMessageConverter来解析
//            // StringHttpMessageConverter 默认用的 ISO-8859-1来编码的
//            returnStr = new String(returnStr.getBytes("ISO-8859-1"), "utf-8");
//
//        } catch (UnsupportedEncodingException e) {
//            log.error("httpGet err {}", e.getMessage());
//        }
//        return returnStr;
//    }

    public static long ipToLong(String ipAddress) {
        long result = 0;
        String[] ipAddressInArray = ipAddress.split("\\.");
        for (int i = 3; i >= 0; i--) {
            long ip = Long.parseLong(ipAddressInArray[3 - i]);
            result |= ip << (i * 8);
        }
        return result;
    }

//    @SuppressWarnings({"serial"})
//    public final static Map<String, String> NetMask = new HashMap<String, String>() {{
//        put("128.0.0.0", "1");
//        put("192.0.0.0", "2");
//        put("224.0.0.0", "3");
//        put("240.0.0.0", "4");
//        put("248.0.0.0", "5");
//        put("252.0.0.0", "6");
//        put("254.0.0.0", "7");
//        put("255.0.0.0", "8");
//        put("255.128.0.0", "9");
//        put("255.192.0.0", "10");
//        put("255.224.0.0", "11");
//        put("255.240.0.0", "12");
//        put("255.248.0.0", "13");
//        put("255.252.0.0", "14");
//        put("255.254.0.0", "15");
//        put("255.255.0.0", "16");
//        put("255.255.128.0", "17");
//        put("255.255.192.0", "18");
//        put("255.255.224.0", "19");
//        put("255.255.240.0", "20");
//        put("255.255.248.0", "21");
//        put("255.255.252.0", "22");
//        put("255.255.254.0", "23");
//        put("255.255.255.0", "24");
//        put("255.255.255.128", "25");
//        put("255.255.255.192", "26");
//        put("255.255.255.224", "27");
//        put("255.255.255.240", "28");
//        put("255.255.255.248", "29");
//        put("255.255.255.252", "30");
//        put("255.255.255.254", "31");
//        put("255.255.255.255", "32");
//    }};


//    public static boolean checkNetMask(String mask) {
//        String num = NetMask.get(mask);
//        if (num != null) {
//            return false;
//        }
//        return true;
//    }
//
//    public static boolean checkGateway(long start, long end, String gateway) {
//        long lGateway = ipToLong(gateway);
//        if (lGateway >= start && lGateway <= end) {
//            return false;
//        }
//        return true;
//    }
}
